CAD-страница НП | Статьи | English | Download || часть 2 | Обработка событий

Прозрачная заставка в форме немодального диалога (C++, часть 1)
(из книги "AutoCAD: разработка приложений, настройка и адаптация";
аналог - вариант реализации на C#, с постепенным изменением прозрачности окна)

Желательно, конечно, чтобы заставка сама исчезала с экрана - например, через пять секунд. Хорошо также, чтобы нетерпеливый пользователь мог сразу закрыть заставку щелчком в клиентской области окна.
Кроме того, интересно сделать заставку прозрачной, чтобы под ней были видны примитивы текущего рисунка. Прозрачности можем добиться, применяя свойство Opacity окон в Windows Forms.
Создайте новый проект Book16 с теми же характеристиками по умолчанию, что и предыдущий (Прим.автора: с поддержкой управляемого кода .NET). Создайте LISP-функцию book16 с помощью C-функции ads_book16 в файле acrxEntryPoint.cpp (см. листинг 5.34).

Листинг 5.34. Функция ads_book16
// Н.Н.Полещук, Глава 05\Book16\acrxEntryPoint.cpp
// В книге "AutoCAD: разработка приложений, настройка и
// адаптация"
// (издательство "BHV-Петербург", 2006)
// http://poleshchuk.spb.ru/cad/
//
// ----- ads_book16 symbol (do not rename)
static int ads_book16(void)
{

splash16();
acedRetVoid () ;
return (RSRSLT) ;
}

Функция splash16 будет функцией с управляемым кодом. Добавьте к проекту файлы Splash16.h и Splash16.cpp с интерфейсом и реализацией функции splash16 и вставьте директиву #include "Splash16.h" в начало файла acrxEntryPoint.cpp.
Файл Splash16.h, помимо прототипа функции splash16, будет содержать описание класса Wform16 диалогового окна. Текст файла Splash16.h приведен в листинге 5.35.

Листинг 5.35. Файл Splash16.h

// Н.Н.Полещук, Глава 05\Book16\Splash16.h
// В книге "AutoCAD: разработка приложений, настройка и
// адаптация"
// (издательство "BHV-Петербург", 2006)
// http://poleshchuk.spb.ru/cad/
//

#pragma once
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
#include "StdAfx.h"
using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;

void splash16();

public __gc class Wform16: public Form
{
public:
Wform16();
protected:
void OnTimerTick(Object *sender, System::EventArgs *ea);
void OnClick(Object *sender, System::EventArgs * ea);
};

Помимо протототипа функции splash16, файл Splash16.h содержит описание управляемого класса, порожденного наследованием от класса Form. Членами класса являются три функции:

  • Wform16 - конструктор класса Wform16;
  • OnTimerTick - функция, обрабатывающая событие (сигнал от таймера);
  • OnClick - функция обработки другого события (щелчка в клиентской области диалогового окна).
В файле Splash16.cpp (листинг 5.36) находятся реализации всех функций.

Листинг 5.36. Файл Splash16.cpp

// Н.Н.Полещук, Глава 05\Book16\Splash16.cpp
// В книге "AutoCAD: разработка приложений, настройка и
// адаптация"
// (издательство "BHV-Петербург", 2006)
// http://poleshchuk.spb.ru/cad/
//

#include "StdAfx.h"
#include "Splash16.h"

using namespace System::Drawing;
using namespace System::Windows::Forms;
using namespace Autodesk::AutoCAD::ApplicationServices;

void splash16()
{
Wform16* pwf = new Wform16();
Autodesk::AutoCAD::ApplicationServices::Application::ShowModelessDialog(pwf);
}

Wform16::Wform16()
{

// Параметры диалогового окна
Size = System::Drawing::Size(370, 300);
StartPosition = FormStartPosition::Manual;
Location = Point(300, 150);
BackColor = Color::Aquamarine;
Opacity = 0.5;
FormBorderStyle = FormBorderStyle::None;

// Шрифт
FontFamily *pFf = new FontFamily("Arial");
System::Drawing::Font *pFont = new System::Drawing::Font(pFf, 36, FontStyle::Bold);

// Надпись в центре окна
Label *pTxt1 = new Label();
pTxt1->Text = S"Book16";
pTxt1->Location = Point(90, 120);
pTxt1->AutoSize = true;
pTxt1->ForeColor = Color::Black;
pTxt1->Font = pFont;
Controls->Add(pTxt1);

// Добавление обработчика события Click для формы
this->Click = new EventHandler(this, &Wform16::OnClick);

// Создание таймера
System::Windows::Forms::Timer *tm = new Timer();
tm->Interval = 5000; // интервал между сигналами
tm->Tick = new EventHandler(this, &Wform16::OnTimerTick);
tm->Enabled = true;
}

void Wform16::OnClick(Object *sender, System::EventArgs *e)
{
// по щелчку закрыть окно
Wform16::Close();
}

// Реакция на первый (и последний) сигнал таймера
void Wform16::OnTimerTick(Object *sender, System::EventArgs *ea)
{
System::Windows::Forms::Timer *t1 = static_cast<System::Windows::Forms::Timer*> (sender);
// Остановка таймера
t1->Stop();
// По первому сигналу закрыть окно
Wform16::Close();
}

Функция splash16 создает экземпляр класса диалога и открывает окно заставки с помощью специального метода ShowModelessDialog, который открывает диалоговое окно в немодальном режиме. Объект диалога уничтожается в результате отслеживания двух стандартных событий: Tick (сигнал от таймера) и Click (щелчок внутри окна). О списке стандартных событий см. следующий раздел.


CAD-страница НП | Статьи | English | Download || часть 2 | Обработка событий